package br.inatel.ec203.projeto.control;

import java.awt.HeadlessException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

import br.inatel.ec203.projeto.model.Bjt;
import br.inatel.ec203.projeto.model.Capacitor;
import br.inatel.ec203.projeto.model.Ci;
import br.inatel.ec203.projeto.model.Item;
import br.inatel.ec203.projeto.model.Fet;
import br.inatel.ec203.projeto.model.OutrosComponentes;
import br.inatel.ec203.projeto.model.Resistor;

public class ArmarioDAO {	
	
	public static String fileName = "componentes.csv";
	public static File file = new File(fileName);
	
	private static ArrayList<Item> componentes = new ArrayList<Item>();
	
	@SuppressWarnings("static-access")
	public void addComponent(Item componente) {
		this.componentes.add(componente);
	}
	
	public List<Item> getComponentes() {
		return componentes;
	}

	@SuppressWarnings("resource")
	public void fillArrayList() {
		try {
			if (file.exists()) {
				Scanner scanner = new Scanner(file);
				while (scanner.hasNext()) {
					String line = scanner.nextLine();
					String[] elements = line.split(Pattern.quote(","));
					
					String descricao = elements[0];
					String valor = elements[1];
					String partNumber = elements[2];
					String encapsulamento = elements[3];
					String localizacao = elements[4];
					int quantidade = Integer.parseInt((elements[5]));										
					Date dataDeModificacao = new Date(); // Elements 6.
					String respModificacao = elements[7];	
					String material;
					
					if (elements[8].equals("Resistor")) {
						material = elements[9];
						Resistor resistor = new Resistor(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						resistor.setPartNumber(partNumber);
						resistor.setEncapsulamento(encapsulamento);
						resistor.setMaterial(material);
						addComponent(resistor);
					}
					else if (elements[8].equals("Capacitor")) {
						material = elements[9];
						String vidaUtil = elements[10];
						Capacitor capacitor = new Capacitor(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						capacitor.setPartNumber(partNumber);
						capacitor.setEncapsulamento(encapsulamento);
						capacitor.setMaterial(material);
						capacitor.setVidaUtil(vidaUtil);
						addComponent(capacitor);
					}
					else if (elements[8].equals("Ci")) {
						String funcionalidade = elements[9];
						String informacoes = elements[10];
						Ci ci = new Ci(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						ci.setPartNumber(partNumber);
						ci.setEncapsulamento(encapsulamento);
						ci.setFuncionalidade(funcionalidade);
						ci.setInformacoes(informacoes);
						addComponent(ci);
					}
					else if (elements[8].equals("Outros")) {
						String tipo = elements[9];
						String informacoes = elements[10];
						OutrosComponentes outros = new OutrosComponentes(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						outros.setPartNumber(partNumber);
						outros.setEncapsulamento(encapsulamento);
						outros.setTipo(tipo);
						outros.setInformacoes(informacoes);
						addComponent(outros);
					}
					else if (elements[8].equals("Fet")) {
						String vds = elements[9];
						String vgs = elements[10];
						String id = elements[11];
						String rdsOn = elements[12];
						String channel = elements[13];
						Fet fet = new Fet(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						fet.setPartNumber(partNumber);
						fet.setEncapsulamento(encapsulamento);
						fet.setVds(vds);
						fet.setVgs(vgs);
						fet.setId(id);
						fet.setRdsOn(rdsOn);
						fet.setCanal(channel);
						addComponent(fet);
					}
					else if (elements[8].equals("Bjt")) {
						String vce = elements[9];
						String ic = elements[10];
						String junction = elements[11];
						Bjt bjt = new Bjt(valor, quantidade, localizacao, descricao, dataDeModificacao, respModificacao);
						bjt.setPartNumber(partNumber);
						bjt.setEncapsulamento(encapsulamento);
						bjt.setVce(vce);
						bjt.setIc(ic);
						bjt.setJuncao(junction);
						addComponent(bjt);
					}
				}				
			}
		} catch (HeadlessException e) {
			JOptionPane.showMessageDialog(null, "Erro HeadlessException");
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Erro FileNotFoundException");
			e.printStackTrace();
		}
	}
	
	public void saveInFile(Item componente, boolean flag) {
		if (!flag) { // So entra neste if se for o primeiro componente a ser inserido na planilha
			clearFile();
		}		

		try {
			String componentAsString = componente.toString();
			FileOutputStream fos = new FileOutputStream(file, true); // Para escrever no fim do arquivo
			PrintStream printStream = new PrintStream(fos);
			printStream.println(componentAsString);
			printStream.close();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Erro ao carregar arquivo", "ERRO", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}

	@SuppressWarnings("resource")
	public void clearFile() {
		try {
			RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
			try {
				randomAccessFile.setLength(0);
			} catch (IOException e) {
				JOptionPane.showMessageDialog(null, "Erro limpar o arquivo", "ERRO", JOptionPane.ERROR_MESSAGE);
			}
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Erro ao acessar o arquivo", "ERRO", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}
}				







